// DEMOII7_6.CPP
// READ THIS!
// To compile make sure to include DDRAW.LIB, DSOUND.LIB,
// DINPUT.LIB, DINPUT8.LIB, WINMM.LIB in the project link list, and of course 
// the C++ source modules T3DLIB1-5.CPP and the headers T3DLIB1-5.H
// be in the working directory of the compiler

// INCLUDES ///////////////////////////////////////////////

#define INITGUID       // make sure al the COM interfaces are available
// instead of this you can include the .LIB file
// DXGUID.LIB

#define WIN32_LEAN_AND_MEAN  


#include <windows.h>   // include important windows stuff
#include <windowsx.h> 
#include <mmsystem.h>
#include <iostream.h> // include important C/C++ stuff
#include <conio.h>
#include <stdlib.h> 
#include <malloc.h>
#include <memory.h>
#include <string.h>
#include <stdarg.h> 
#include <stdio.h> 
#include <math.h>
#include <io.h>
#include <fcntl.h>

#include "ddraw.h"  // directX includes
#include "T3DLIB1.h" // game library includes
extern "C"
{
#include "our_3d_lib/our_draw32.h"
#include "our_3d_lib/our_math.h"
#include "our_3d_lib/our_3d.h"
#include "our_3d_lib/our_main.h"
#include "our_3d_lib/our_cpu.h"

//extern int Game_Init(void);
//extern int Game_Main(UCHAR *video_buffer, int lpitch, int FPS);
}

int Game_Shutdown(void);



// DEFINES ////////////////////////////////////////////////


// defines for windows interface
#define WINDOW_CLASS_NAME "WIN3DCLASS"  // class name
#define WINDOW_TITLE      "our_3d_engine demo"
#define WINDOW_WIDTH      LCD_W // size of window
#define WINDOW_HEIGHT     LCD_H

#define WINDOW_BPP        16    // bitdepth of window (8,16,24 etc.)
// note: if windowed and not
// fullscreen then bitdepth must
// be same as system bitdepth
// also if 8-bit the a pallete
// is created and attached

#define WINDOWED_APP      1   // 0 not windowed, 1 windowed


// defines for the game universe
#define UNIVERSE_RADIUS   4000

#define POINT_SIZE        200
#define NUM_POINTS_X      (2*UNIVERSE_RADIUS/POINT_SIZE)
#define NUM_POINTS_Z      (2*UNIVERSE_RADIUS/POINT_SIZE)
#define NUM_POINTS        (NUM_POINTS_X*NUM_POINTS_Z)





// PROTOTYPES /////////////////////////////////////////////

// game console
//int Game_Init(void );
//int Game_Shutdown(void );
//int Game_Main(void *parms=NULL);

// GLOBALS ////////////////////////////////////////////////

HWND main_window_handle           = NULL; // save the window handle
HINSTANCE main_instance           = NULL; // save the instance
char buffer[2048];                        // used to print text

// initialize camera position and direction
//============================================
//============================================
// FUNCTIONS //////////////////////////////////////////////



int keyin,keyhold=0,c=1;
int first1=0;

LRESULT CALLBACK WindowProc(HWND hwnd, 
                            UINT msg, 
                            WPARAM wparam, 
                            LPARAM lparam)
{
    // this is the main message handler of the system
    PAINTSTRUCT	ps;		   // used in WM_PAINT
    HDC			hdc;	   // handle to a device context
    
    // what is the message 
    switch(msg)
    {	
    case WM_CREATE: 
        {
            // do initialization stuff here
            return(0);
        } break;
        
    case WM_PAINT:
        {
            // start painting
            hdc = BeginPaint(hwnd,&ps);
            
            // end painting
            EndPaint(hwnd,&ps);
            return(0);
        } break;
        
    case WM_DESTROY: 
        {
            // kill the application			
            PostQuitMessage(0);
            return(0);
        } break;
        
    case WM_KEYDOWN: 
        {
            // kill the application	
            if(!keyhold)
            {
                keyhold=1;
                keyin=wparam;
                c++;
            }
            //return(0);
        } break;
    case WM_KEYUP: 
        {
            // kill the application			
            keyhold=0;
            //return(0);
        } break;
    default:break;
        
    } // end switch

    
    // process any messages that we didn't take care of 
    return (DefWindowProc(hwnd, msg, wparam, lparam));
    
} // end WinProc

// WINMAIN ////////////////////////////////////////////////

int WINAPI WinMain(	HINSTANCE hinstance,
                   HINSTANCE hprevinstance,
                   LPSTR lpcmdline,
                   int ncmdshow)
{
    // this is the winmain function
    
    WNDCLASS winclass;	// this will hold the class we create
    HWND	 hwnd;		// generic window handle
    MSG		 msg;		// generic message
    HDC      hdc;       // generic dc
    PAINTSTRUCT ps;     // generic paintstruct
    static int frame=0,frame2=0,time_fram=1;
    // first fill in the window class stucture
    winclass.style			= CS_DBLCLKS | CS_OWNDC | 
        CS_HREDRAW | CS_VREDRAW;
    winclass.lpfnWndProc	= WindowProc;
    winclass.cbClsExtra		= 0;
    winclass.cbWndExtra		= 0;
    winclass.hInstance		= hinstance;
    winclass.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
    winclass.hCursor		= LoadCursor(NULL, IDC_ARROW);
    winclass.hbrBackground	= (HBRUSH)GetStockObject(BLACK_BRUSH);
    winclass.lpszMenuName	= NULL; 
    winclass.lpszClassName	= WINDOW_CLASS_NAME;
    
    // register the window class
    if (!RegisterClass(&winclass))
        return(0);
    




    // create the window, note the test to see if WINDOWED_APP is
    // true to select the appropriate window flags
    if (!(hwnd = CreateWindow(WINDOW_CLASS_NAME, // class
        WINDOW_TITLE,	 // title
        (WINDOWED_APP ? (WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION) : (WS_POPUP | WS_VISIBLE)),
        0,0,	   // x,y
        LCD_W,  // width
        LCD_H, // height
        NULL,	   // handle to parent 
        NULL,	   // handle to menu
        hinstance,// instance
        NULL)))	// creation parms
        return(0);    
    // save the window handle and instance in a global
    main_window_handle = hwnd;
    main_instance      = hinstance;
    





    // resize the window so that client is really width x height
    if (WINDOWED_APP)
    {
        // now resize the window, so the client area is the actual size requested
        // since there may be borders and controls if this is going to be a windowed app
        // if the app is not windowed then it won't matter
        RECT window_rect = {0,0,LCD_W-1,LCD_H-1};
        
        // make the call to adjust window_rect
        AdjustWindowRectEx(&window_rect,
            GetWindowStyle(main_window_handle),
            GetMenu(main_window_handle) != NULL,  
            GetWindowExStyle(main_window_handle));
        
        // save the global client offsets, they are needed in DDraw_Flip()
        window_client_x0 = -window_rect.left;
        window_client_y0 = -window_rect.top;
        
        // now resize the window with a call to MoveWindow()
        MoveWindow(main_window_handle,
            0, // x position
            0, // y position
            window_rect.right - window_rect.left, // width
            window_rect.bottom - window_rect.top, // height
            FALSE);
        
        // show the window, so there's no garbage on first render
        ShowWindow(main_window_handle, SW_SHOW);
    } // end if windowed
    
    // perform all game console specific initialization    
    
    //ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
    // start up DirectDraw (replace the parms as you desire)
    DDraw_Init(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_BPP, WINDOWED_APP);
    
    // hide the mouse
    if (!WINDOWED_APP)
        ShowCursor(FALSE);
    
    // seed random number generator
    //srand(Start_Clock());
    //eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
    //Open_Error_File("ERROR.TXT");

    
    
    // disable CTRL-ALT_DEL, ALT_TAB, comment this line out 
    // if it causes your system to crash
    SystemParametersInfo(SPI_SCREENSAVERRUNNING, TRUE, NULL, 0);
    	
    OUR_3D_Init();
    // enter main event loop
    while(1)
    {
        if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        { 
            // test if this is a quit
            if (msg.message == WM_QUIT)
                break;
            // translate any accelerator keys
            TranslateMessage(&msg);
            // send the message to the window proc
            DispatchMessage(&msg);
        } // end if
        //    
        DDraw_Flip();    
        // main game processing goes here
        
        DDraw_Lock_Back_Surface();
    
        if(c)
        {
            //DDraw_Fill_Surface(lpddsback, OUR_RGB32_2_16(0xff));
            c=OUR_3D_Main( back_buffer, keyin,  frame2);
        }
        keyin=0;
		/*
        if(keyin == 39)
        {
            if(first1)
            {
                first1=0;
                keyin=0;
            }
            else
            {
                first1=1;
            }
        }
        else
        {
        }
*/
        DDraw_Unlock_Back_Surface();
        frame++;
        if(GetTickCount()- time_fram>1000)
        {	frame2=frame;
        frame=0;
        time_fram=GetTickCount();
        }
        Sleep(80);

    } // end while
    // shutdown game and release all resources
    Game_Shutdown();
     
    // enable CTRL-ALT_DEL, ALT_TAB, comment this line out 
    // if it causes your system to crash
    SystemParametersInfo(SPI_SCREENSAVERRUNNING, FALSE, NULL, 0);
    
    // return to Windows like this
    return(msg.wParam);
           

} // end WinMain

// T3D II GAME PROGRAMMING CONSOLE FUNCTIONS ////////////////

int Game_Shutdown(void)
{
    
    DDraw_Shutdown();
    
    return(1);
} // end Game_Shutdown

